//
//  SEGWindmillComponent.h
//  RefreshDemo
//
//  Created by Clavis on 2019/1/2.
//  Copyright © 2019 Clavis. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "SEGWindmillConst.h"
#import "UIView+SEGAdd.h"
#import "UIScrollView+SEGExtension.h"

/** 刷新控件的状态 */
typedef NS_ENUM(NSInteger, SEGRefreshState) {
    /** 普通闲置状态 */
    SEGRefreshStateIdle = 1,
    /** 松开就可以进行刷新的状态 */
    SEGRefreshStatePulling,
    /** 正在刷新中的状态 */
    SEGRefreshStateRefreshing,
    /** 即将刷新的状态 */
    SEGRefreshStateWillRefresh,
    /** 所有数据加载完毕，没有更多的数据了 */
    SEGRefreshStateNoMoreData
};

/** 开始刷新的回调 */
typedef void(^SEGWindmillComponentRefreshBeginBlock)(void);

NS_ASSUME_NONNULL_BEGIN

@interface SEGWindmillComponent : UIView {
    /** 记录scrollView刚开始的inset */
    UIEdgeInsets _scrollViewOriginalInset;
    /** 父控件 */
    __weak UIScrollView *_scrollView;
}

/** 正在刷新的回调 */
@property (nonatomic, copy) SEGWindmillComponentRefreshBeginBlock refreshingBlock;
/** 触发回调（交给子类去调用） */
- (void)executeRefreshingCallback;

#pragma mark - 刷新状态控制
/** 进入刷新状态 */
- (void)beginRefreshing;
/** 结束刷新状态 */
- (void)endRefreshing;
/** 是否正在刷新 */
@property (assign, nonatomic, readonly, getter=isRefreshing) BOOL refreshing;
//- (BOOL)isRefreshing;
/** 刷新状态 一般交给子类内部实现 */
@property (assign, nonatomic) SEGRefreshState state;

#pragma mark - 交给子类去访问
/** 记录scrollView刚开始的inset */
@property (assign, nonatomic, readonly) UIEdgeInsets scrollViewOriginalInset;
/** 父控件 */
@property (weak, nonatomic, readonly) UIScrollView *scrollView;

#pragma mark - 交给子类们去实现
/** 初始化 */
- (void)prepare NS_REQUIRES_SUPER;
/** 摆放子控件frame */
- (void)placeSubviews NS_REQUIRES_SUPER;
/** 当scrollView的contentOffset发生改变的时候调用 */
- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;
/** 当scrollView的contentSize发生改变的时候调用 */
- (void)scrollViewContentSizeDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;
/** 当scrollView的拖拽状态发生改变的时候调用 */
- (void)scrollViewPanStateDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;


#pragma mark - 其他
/** 拉拽的百分比(交给子类重写) */
@property (assign, nonatomic) CGFloat pullingPercent;
/** 根据拖拽比例自动切换透明度 */
@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha;

@end

NS_ASSUME_NONNULL_END
